package com.rjj.wlqq.listen.handle;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**  
  * @Title: 过滤器
  * @author 任建军
  * @date 2019/1/7 11:41
  * @Description:
  * @URL: https://blog.csdn.net/w214019153/article/details/68491523
 *
 *
 * 一、过滤器
 * 1.什么是过滤器？
 *
 * 过滤器是一个程序，它先于与之相关的servlet或JSP页面运行在服务器上。过滤器可附加到一个或多个servlet或JSP页面上，并且可以检查进入这些资源的请求信息。在这之后，过滤器可以作如下的选择：
 * ①以常规的方式调用资源（即，调用servlet或JSP页面）。
 * ②利用修改过的请求信息调用资源。
 * ③调用资源，但在发送响应到客户机前对其进行修改。
 * ④阻止该资源调用，代之以转到其他的资源，返回一个特定的状态代码或生成替换输出。
 *
 * 2.Servlet过滤器的基本原理：
 *
 * 在Servlet作为过滤器使用时，它可以对客户的请求进行处理。处理完成后，它会交给下一个过滤器处理，这样，客户的请求在过滤链里逐个处理，直到请求发送到目标为止。例如，某网站里有提交“修改的注册信息”的网页，当用户填写完修改信息并提交后，服务器在进行处理时需要做两项工作：判断客户端的会话是否有效；对提交的数据进行统一编码。这两项工作可以在由两个过滤器组成的过滤链里进行处理。当过滤器处理成功后，把提交的数据发送到最终目标；如果过滤器处理不成功，将把视图派发到指定的错误页面。
 *
    二、拦截器
    1.什么是拦截器？

    拦截器，在AOP（Aspect-Oriented Programming）中用于在某个方法或字段被访问之前，进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
    在Webwork的中文文档的解释为——拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码，也可以在一个action执行前阻止其执行。同时也是提供了一种可以提取action中可重用的部分的方式。
    谈到拦截器，还有一个词大家应该知道——拦截器链（Interceptor Chain，在Struts 2中称为拦截器栈 Interceptor Stack）。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时，拦截器链中的拦截器就会按其之前定义的顺序被调用。

    2.拦截器的实现原理：

    大部分时候，拦截器方法都是通过代理的方式来调用的。Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时，Struts 2会查找配置文件，并根据其配置实例化相对的拦截器对象，然后串成一个列表（list），最后一个一个地调用列表中的拦截器。
    ---------------------
    拦截器与过滤器的区别 ：

    1. 拦截器是基于java的反射机制的，而过滤器是基于函数回调。
    2. 拦截器不依赖与servlet容器，过滤器依赖与servlet容器。
    3. 拦截器只能对action请求起作用，而过滤器则可以对几乎所有的请求起作用。
    4. 拦截器可以访问action上下文、值栈里的对象，而过滤器不能访问。
    5. 在action的生命周期中，拦截器可以多次被调用，而过滤器只能在容器初始化时被调用一次拦截器的代
    码实现。
    6. Filter基于回调函数，我们需要实现的filter接口中doFilter方法就是回调函数，而interceptor则基于
    java本身的反射机制,这是两者最本质的区别。
    7. Filter是依赖于servlet容器的，即只能在servlet容器中执行，很显然没有servlet容器就无法来回调
    doFilter方法。而interceptor与servlet容器无关。
    8. Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面，图片，文件等等，
    而Interceptor只能过滤请求。
    9. Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过在xml声明是guest请求还
    是user请求来辨别是否过滤。
    ---------------------
    作者：suk1M
    来源：CSDN
    原文：https://blog.csdn.net/w214019153/article/details/68491523
    版权声明：本文为博主原创文章，转载请附上博文链接！
  */
public class GlobleHandle implements Filter {

    Logger logger = LoggerFactory.getLogger(GlobleHandle.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("GlobleHandle-init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        logger.info("请求url：" + ((HttpServletRequest)request).getRequestURI());
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        logger.info("destroy");
    }
}
